Lecture 01 paper-1: Lakehouse: A New Generation of Open Platforms that Unify Data Warehousing and Advanced Analytics(M.Armbrust, et al., CIDR 2021)

📄 正在加载 PDF...

Abstract

这篇论文认为,我们目前的传统数据仓库架构将会被一种新的架构模式——Lakehouse所取代,并且论述了Lakehouse的创新点和如何影响数据库管理领域的,最终通过TPC-DS测试(这是评估数据仓库查询性能的标准测试) 结果说明其能与当前流行的主流云数据库想媲美。

在文章的abstract部分,其实就已经很明了的说明了Lakehouse的三个核心特征

Lakehouse可以解决传统数据库存在的一些关键问题,换句话说就是传统数据库的缺点,以及Lakehouse的优点

至于什么是传统的数据库,上面的这五个名词到底是什么意思,在文章的后面一一都进行了介绍。

Introduce

History and Challenges

第一代数据分析平台 (first generation data analytics platforms)

首先这是data warehousing哈,不是数据库

第二代数据分析平台(second generation data analytics platforms)

第二代数据分析平台将原始数据存入了Data Lake(数据湖).

数据湖是一种较低成本的存储系统, 通过file API来管理数据,使用的也是前面所提到的通用的开放的文件格式Apache Parquest, 这里还提到了一种叫ORC, 这两种都是列式存储格式,非常适合大数据分析

最早是从Apache Hadoop开始的,采用的是Hadoop的分布式文件系统(HDFS),后文也会提到,这是一种本地的分布式文件系统, 这里的主要思想就是,不在乎数据是什么,先存进去再说

schema-on-read架构,这与第一代仓库使用的schema-on-write架构不同,schema-on-read架构是读取数据时才解析结构,好处就是灵活低成本存储任何数据(包括非结构化), 坏处就是数据质量,数据处理,数据治理的问题还得给后面的环节。

具体的做法就是一小部分数据会从Data Lake中扔进(ETLed)下游的数据仓库中, 在这里文中举了一个例子是是Teradata.

首先ELTed是什么? -- Extract(提取) - Transform(转换) - Load(加载)

我查了一下Teradata,其实Teradata是第一代数据分析平台的代表作之一,所以说第二代数据分析平台最终还是ELT进传统仓库,才能被BI工具使用

但是 数据湖中的数据可以被机器学习平台等各种分析引擎直接访问

cloud data lacks

2015年开始,从本地Hadoop(HDFS)像云端迁移, 出现了一种更主流的架构two-tier architecture(数据湖+数据仓库的两层架构)

选择云存储的好处在于

但其余架构和第二代数据平台完全相同

事实证明,这是现在最主流的架构,几乎所有的世界前五百强企业都在用

The Challenges of two-tier architecture

虽然当前主流数据架构看上去很便宜,但是问题是他多了一个步骤(先ELT到data lack,在ELT到data warehouse),这会导致复杂,延迟,多了一个可能出错的环节的问题。除此之外,事实证明,对于机器学习等高级分析来说,data lake和data warehouse都不是理想的解决方案

现在的主流的two-tier architecture有下面的问题(这也是不是理想方案的原因):

Solution

straw-man solution

文中还提到了一种稻草人式的解决方案,主要思想是完全去掉数据湖,把所有的数据存进一个”存算分离”的现代化数据仓库。

所谓的稻草人的意思就是看起来能解决问题,但实际缺不太可行的方案

文中给出了不太可行的原因

所以,最终引出了this paper所提出来的architecture -- Lakehouse

In this paper, we discuss the following technical question:

is it possible to turn data lakes based on standard open data formats, such as Parquet and ORC, into high-performance systems that can provide both the performance and management features of data warehouses and fast, direct I/O from advanced analytics workloads?

核心的问题就是,基于开放格式的数据湖,改造一种高性能系统,使其具备数据仓库的性能和管理能力,又满足高级分析任务的快速IO要求

换句话说就是,拥有

Pasted image 20250701105420.png

文章中说认为Lakehouse的时机成熟,并且列举了三个原因来解释为什么现在是Lakehouse架构发展的最佳时机,其实这也对应了本文中心思想的第一句,是说 认为目前的传统数据仓库架构将会被一种新的架构模式——Lakehouse所取代这个观点。

Reason 1: Reliable data management on data lakes

传统data lake的问题:管理"文件堆" --> 所以缺乏数据仓库具备的高级功能(如事务管理,回滚, 零克隆拷贝)

新技术Delta Lake & Apache Iceberg的出现: 给Parquet/ORC加了事务层和元数据管理 -> data lake 具备了像数据仓库一样的写入原子性等等 -> in other words, data lake 像 仓库一样可靠了

所以说带来的改进就是 lakehouse中的ETL步骤会变少,因为分析人员可以直接, 轻松访问data lake中的原始表

Reason 2: Support for machine learning and data science

首先一点,由于机器学习系统本身就支持直接读取Parquet, ORC等数据湖中的开放格式,所以Lakehouse天然就适合机器学习。

此外,现在多数系统采用DataFrame作为操作数据的抽象,通过声名性DataFrame API,可以在ML工作负载中执行数据访问的查询优化。也就是说,Lakehouse可以将SQL优化能力带给ML,使得训练更快

Reason 3: SQL performance

传统仓库 vs. Lakehouse

文章提到的Solution是可以通过一系列优化技术

来大大提升在Rarquet/ORC上的SQL查询性能

但是文章到目前为止还没有说是哪些优化技术

除此之外,我觉得辅助数据 可能是一些索引,或者聚合函数所要用的哪些统计信息等等,以及一些元数据

Motivation: Data Warehousing Challenges

Challenge 1: data quality and reliability.

其实还是数据质量和可靠性的这一点

文中说数据管道(data pipelines)现在本来就很难实现, 现在的two-tier data architecture 更是增加了这一复杂性,因为数据湖和仓库使用的数据类型可能不同,SQL语法不同,数据存储格式不同(一个可能标准化,一个可能非标准化)

这就不如第一代同种情况下传输的可靠了

Challenge 2: staleness

说白了就是延迟 前面介绍过 会导致很多系统 比如说推荐系统 可能失效

但是文中这里补充说了一个 可以选择流处理管道来缓解延迟, 但比批处理更难开发和运维,落地困难。

Challenge 3

现在非结构化的数据(图像, 传感器, 文档)越来越多, SQL及其API不支持

Challenge 4

machine learning 和 data science 对现在的data lake 和 data warehouse并不友好,原因是因为先来machine learning 和 data science一般都用在非SQL的编程语言上(比如我们经常用的是python), 并不能高效运行在ODBC / JDBC接口支行

作者认为:为 ML 系统提供对开放数据格式的直接访问能力是最好的支持方式。

Existing steps towards Lakehouse

其实前面也提到过,作者认为,现有产业趋势已经在朝Lakehouse过渡了

Trend1: 几乎所有的数据仓库都增加了对Rarquet和ORC格式的外部表的支持

换句话说,就是现在所有的主流数据库都支持通过"外部表" 连接到Rarquet/ORC, 这使得用户可以在SQL中直接查询数据湖中的数据

但这没有解决实质性的问题: 没有改善data lake的管理难题,也没有消除ETL的复杂性,数据时效性等

除此之外,在实践中发现,性能不好,因为数据库一般都是对其内部的规则化类型进行了优化的。

Trend 2: 出现了像Spark SQL, Presto, Hive, Athena 这种直接可以跑在data lake上的系统

这就是说,他跳过了传统的数据仓库,所以问题就是 data lake并不能像数据仓库一样存在ACID事务,索引等等的管理机制,总结来说,就是他们没法实现和数据仓库一样的性能和可靠性

The Lakehouse Architecture

首先下定义了

We define a Lakehouse as a data management system based on low-cost and directly-accessible storage that also provides traditional analytical DBMS management and performance features such as ACID transactions, data versioning, auditing, indexing, caching, and query optimization.

什么是Lakehouse

所以说Lakehouse想干的事情就是融合data lake和data warehouse的优势

所以说关键在于能否兼得

不过文章也提到了一个问题,Lakehouse支持直接访问数据意味着放弃了一部分数据独立性

什么是数据独立性,指的是应用不需要知道数据的物理结构和存储细节,DBMS 会做抽象和优化。

而Lakehouse会直接操作底层的数据格式,这一定程度上打破了抽象

同时文章指出,Lakehouse特别适合云计算场景: 不同的计算应用程序可以在完全独立的计算节点上按需运行(例如用于ML的GPU集群)同时直接访问相同的存储数据.

这些异构计算任务可以按需启动,共同访问相同的数据,无需复制

除此之外,也可以在本地上比如前面提到的Hadoop的HDFS

然后提到了一种可行的Lakehouse设计方案,基于业界的三大技术突破。

主要组成有

但是文章也提到了,本文实现的是基于Rarquet,但也可以使用其他的开放格式,Lakehouse是一个开放框架,而不是固定实现

Implementing a Lakehouse System

The first key idea we propose for implementing a Lakehouse is to have the system store data in a low-cost object store (e.g., Amazon S3) using a standard file format such as Apache Parquet, but implement a transactional metadata layer on top of the object store that defines which objects are part of a table version

first key: object store + transactional metadata

obejct store: 对象存储(Amazon S3) + 标准文件格式(Apache Rarquet)

transactional metadata: 那些文件属于哪个表版本, 谁是当前有效数据。 当然这是管理而不是存储真正的数据

-> 在事务元数据层 ACID, 版本控制;大量数据保留在低成本对象存储S3中.客户端仍然可以直接读取这些 Parquet 文件,无须复杂中间处理

成功案例: Delta Lake 和 Apache Iceberg

state-of-the-art performance...

光靠transaction metadata并不能实现高性能的SQL查询..

文中首先提了data warehouse做的一些优化:

不过lakehouse是完全摒弃了传统的数据库的,但是这些方法也能借鉴。唯一一个没法借鉴的是不能借鉴传统数据库通过更改格式进行格式优化,因为lakehouse使用的是开放的格式

那么也就是说lakehouse可以

->这样就可以在开放格式的前提下,做到类仓库的SQL性能

DataFrame API for ML and DS

大多数的ML系统,都支持使用DataFrame API来进行预处理

后来我查了一下,DataFrame就像表格形式的数据结构,许多ML和数据分析系统,比如说TensorFlow, PyTorch,Spark, Pandas都会先使用DataFrame做好数据清洗,转换,筛选等与处理步骤。

文章后面其实也介绍到了,DataFrame是由R和Pandas最早普及开的,他们提供了一个表格抽象,支持各种转换操作符(filter,group by, join),这些操作可以对应到关系代数中的基本操作,也就是说他们和数据库的优化逻辑是兼容的

也就是说,如果这些操作是声明式的,比如Spark SQL就把DataFrame API做成了声明式(declarative)的,那么用户写的操作并不立即执行,而是最终把这些操作传给优化器,由优化器做全局优化后再执行。

这就像 SQL 查询优化器在执行前会先对 SQL 查询做逻辑计划和物理计划一样。这种方式能合并多个操作、减少扫描、提前过滤、复用中间结果等

所以说,这些DataFrame API可以很好的利用Lakehouse的新特性,比如缓存和辅助结构 加快机器学习的预处理阶段

Pasted image 20250702152449.png|500

Metadata Layers for Data Management

The first component that we believe will enable Lakehouses is metadata layers over data lake storage that can raise its abstraction level to implement ACID transactions and other management features.

实现Lakehouse的第一关键能力就是 在 data lake上加一个metadata layers,提升抽象层次,实现ACID事务等其他功能

why? 为什么需要元数据层?

像Amazon S3或 HDFS这样的data lake, 本质上只是文件系统或对象存储结构,只能提供存文件和取文件的低级操作 -- 更新一个这样的操作,如果设计多个文件,没法保持原子性

Apache Hive ACID

Hive最早引入了ACID,但是使用一个数据库(OLTP DBMS), 记录表的文件元信息(比如这个文件在哪里)

Delta Lake

2016, Databricks

把事务日志也写在对象存储中,而且日志格式也是Parquet

能支持每个表包含数十亿个对象,可扩展性很好

Apache Iceberg

started Netflix

类似Delta Lake, 只不过支持Parquet,ORC文件格式

Apache Hudi

started Uber

强调对流式写入的支持,但不支持多用户并发写入

-> 这些系统相较于原始的Rarquet, ORC文件湖, 性能好 而且提供

zero-copy cloning and zero-copy conversion

把已有的 Parquet 数据目录转换为 Delta 表,不动数据,只加元数据日志, 数据湖迁移更加简单,这是zero-copy conversion

在 Delta Lake 中复制一个表/子集/版本,不复制底层文件,只复制事务日志引用,这是zero-copy cloning

data quality enforcement

数据质量控制

举例 Delta Lake

  1. schema enforcement: 模式强制,要求写入的数据结构必须符合表定义的schema, 否则拒绝
  2. constraints API: 约束接口,事实上其实就是字段取值约束

客户端能够自动处理异常数据,拒绝or放入"特殊区域"(eg quarantine文件), 手动确认后再导入

-> 增加了数据管道的可信度 稳定性

data governance

数据治理功能

Future Directions and Alternative Designs

Challenge 1: 当前的设计是Delta Lake把事务存在了对象管理中,当然优点是无需额外的系统或者是环境,方便管理,可用性高。但是对象管理的写入延迟高,导致每秒事务数量受限

Challenge 2: 目前只支持代表事务,缺少跨表事务支持。目前主流的系统 Delta, Iceberg, Hudi都仅支持代表ACID事务.

Challenge 3: 事务日志格式,目前为Json/Parquet, 但可以采取优化为更紧凑,更高效的结构(比如二进制?)

Challenge 4: 对象大小, 数据太小会导致元数据爆炸,数据太大不利于并行处理 -- 需要权衡

SQL Performance in a Lakehouse

Perhaps the largest technical question with the Lakehouse approach is how to provide state-of-the-art SQL performance while giving up a significant portion of the data independence in a traditional DBMS design.

文中认为最大的技术问题之一是 在缺乏数据库data independence(数据独立性)的情况下,如何依然做到state-of-art SQL performance.

什么是数据独立性?

传统数据库中,应用程序只关心SQL查询,而不关心底层数据是怎么存的,数据库系统可以自由决定数据的结构,比如页结构,索引策略来优化性能

但在Lakehouse, 为了ML, 需要暴露数据的存储格式作为公开API,这就牺牲了一部分数据独立性

当然是否能做到state-of-art SQL performance 依赖于很多因素,文章中列举了两个关键点

其一是缓冲

其二是替换现有的文件格式,是否能用最新的,更高效的格式来替代

所以最大的问题是,一旦选定了对外的开放数据格式,不能随意更改数据格式,所有优化手段都要在不改文件格式的前提下进行

文章提出了三类"与格式无关"的优化手段,并在Databricks的Delta Engine进行了实际验证,效果与顶级云数仓媲美

Caching

当使用Delta Lake这样的事务元数据层时,Lakehouse可以把文件缓存在更快的处理节点上(SSD,RAM). 因为什么? 因为zero-copy, 而且每次查询都可以查询事务日志,确保缓存的数据是最新版本。

除此之外,缓存内容还可以是transcoded format(转码后的版本), 比如部分解压等在传统数据仓库中的各种优化

Auxiliary Data

辅助数据结构

文中提到了很多种辅助数据结构

Data Layout

数据排序方式可以被优化

整体:

Pasted image 20250702185633.png|400

Future Directions and Alternative Designs

Future 1: 目前主流的格式是Apache Parquet和Apache ORC,但它们原本是为离线批处理设计的,并不完美适配现代 Lakehouse 的要求, 目前可能需要具备适应灵活布局能力,更易构建索引,更适合现代硬件(如列式内存, GPU加速)的新格式. 但这是一个长期的研究问题,因为新的格式无法短期内被大量的处理引擎采纳

Furture 2: 继续挖掘缓存,索引,布局优化策略.

Efficient Access for Advanced Analytics

像机器学习训练、图分析、统计分析这类代码,通常使用Python的命令式代码编写的,没法作为SQL运行,所以也很难被SQL优化器加速

Solution: 声明式的DataFrame API + SQL 优化器

One approach that we’ve had success with is offering a declarative version of the DataFrame APIs used in these libraries, which maps data preparation computations into Spark SQL query plans and can benefit from the optimizations in Delta Lake and Delta Engine.

把用户写的DataFrame操作转换为Spark SQL查询计划,并可以在Delta Lake和Delta Engine的优化中收益.

Spark的查询规划器将用户DataFrame计算中的选择和投影直接推送到每个数据源读取的“数据源”插件类中,比如只选了 df["user_id", "age"],Spark 不会加载整个表,Spark 会告诉 Delta Lake 插件“只加载这两列”,从而减少 IO 和解码开销。

也利用了前面的缓存,数据布局,数据跳过来优化读取,从而加速

Pasted image 20250702190433.png

图中的整个过程是这样的:

users = spark.table("users")
buyers = users[users.kind == "buyer"]
train_set = buyers[["date", "zip", "price"]].fillna(0)

这段代码使用了PySpark的DataFrame API来从Delta Lake中读取"user"表,过滤出 kind == "buyer" 的行;选取三列 date, zip, price;用 0 填充空值(fillna(0)

Spark的lazy evaluation(懒执行)并不会立即执行每一行代码,而是构建一个查询计划

这个查询计划也不会立即运行,而是等待触发操作在执行

当Spark真正用数据的时候,比如model.fit(train_set)的时候,会将这个查询计划传递给Delta Lake.

Delta Lake会利用Metadata layer来确定那些文件分区需要读取,能否直接从缓存读取,是否有统计信息或者索引加速

但很多ML框架没法做查询下推,像tf.data这样的API更关注在CPU/GPU 异构加载和数据预处理 + GPU 训练 的流水线式并行,不会把“只读某几列、只要满足某条件的数据”等语义下推到底层,这就需要 Lakehouse 专门优化数据加载与 GPU 计算之间的配合。

Future Directions and Alternative Designs

除了前面提到的现有 API 和效率优化问题之外,我们还可以探索截然不同的数据访问接口设计方式,用于支持机器学习。例如,最近的研究提出了“因式分解机器学习(factorized ML)”框架,将机器学习逻辑直接嵌入到 SQL 的 join 操作中,并探索将传统 SQL 查询优化技术应用于 SQL 实现的 ML 算法。

我们仍然需要一套标准接口,以便数据科学家能够充分利用 Lakehouse(或数据仓库)中的强大数据管理能力。在 Databricks,我们将 Delta Lake 与 ML 实验追踪平台 MLflow 集成,使数据科学家可以轻松地记录实验所使用的表版本,并在之后复现该数据版本。

此外,业界正在兴起一种新的抽象层——特征仓库(Feature Store),用于存储和更新机器学习应用中使用的特征,这类系统如果基于 Lakehouse 的标准数据库功能(如事务和版本控制)将会受益匪浅。

JSON